package com.dyit.service.impl;


import com.dyit.config.RabbitMqConfig;
import com.dyit.dao.IBookDao;
import com.dyit.dao.IUserDao;
import com.dyit.entity.Book;
import com.dyit.entity.User;
import com.dyit.exception.user.*;
import com.dyit.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;
@Transactional
@Slf4j
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private IBookDao ibd;
    @Autowired
    private IUserDao iud;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 用户登录，根据账号和密码进行判断
     * @param account
     * @param password
     * @return
     */
    @Override
    public User login(String account, String password) {
        //如果用户未输入账号
        if("".equals(account)||account==null ){
            throw new AccountBlankException("你没有输入账号！");
        }

        //用户未输入密码
        if("".equals(password)||password==null){
            throw new PasswordBlankException("你没有输入密码！");
        }

        //数据库里没有这个用户名对应的用户对象
        List<User> users = iud.findByAccount(account);
        if(users==null){
            throw new AccountNotExistException("账号不存在！");
        }

        //数据库里找不到根据输入的账号密码对应的用户对象
        User user = iud.findUserByAccountAndPassword(account,password);
        if(user==null){
            throw new PasswordIncorrectException("用户名或密码不正确！");
        }

        //找到的情况——————》
        return user;
    }

    /**
     *
     * @param library_id
     * @return
     * 根据图书馆id查询该图书馆数目
     */
    @Override
    public List<Book> findAllBooks(int library_id) {

        List<Book> list = ibd.findAllByLibrary(library_id);
        return list;
    }

    /**
     *
     * @param account
     * @return
     */
    @Override
    public boolean checkUsername(String account) {//缓存中出现了这个名字就返回true
        return stringRedisTemplate.opsForSet().isMember("accounts",account);
    }

    /**
     * 判断用户是否存在在缓存里
     * @param user
     */
    @Override
    public void regist(User user) {
        if (user.getAccount()==null){
            throw new AccountBlankException("用户名不能为空");
        }else if(user.getPassword()==null){
            throw new PasswordBlankException("密码不能为空！");
        }else if (user.getPassword()==null && user.getAccount()==null){
            throw new AccountAndPasswordBlankException("请输入内容，你的用户名和密码不能为空！");
        }else if (checkUsername(user.getAccount())){//看缓存中有无这个账户出现
            throw new AccountExistsException("此用户名已存在！请换个试试~");
        }
        //把所有的异常情况考虑了之后，就可以放了，但不能放进数据库，要放进rabbitmq缓冲队列，数据库自动取（数据库是消费者，自动消费）
        rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE,"orange.topic.apple",user);
        log.debug("生产者生产了对象放入mq里~~~~"+user);
    }
    @RabbitListener(queues = {"queue_a","queue_b"})
    @Override
    public void addUser(User user) {
        iud.save(user);
        log.debug("消费者消费了一个user对象~~~~放入数据库里~~~"+user);
    }
    /**
     * 用户根据自己的id查询自己的借书记录
     */
//    @Override
//    public List<BorrowTwo> findBorrowHistoryByUser_id(int id) {
//        List<Borrow> list = iBorrowDao.findAllByUser_id(id);
//        //根据用户id拿到了用户借书记录对象
//        if (list==null){
//            return null;
//        }
//        List<BorrowTwo> listTwo = new ArrayList<>();
//        for (Borrow borrow:
//             list) {
//                listTwo.add(
//                        new BorrowTwo(
//                                borrow.getId(),
//                                iud.findUserById(borrow.getUser_id()).getName(),
//                                iBookDao.findBookById(borrow.getBook_id()).getTitle(),
//                                iLibraryDao.findLibraryById(borrow.getLibrary_id()).getName(),
//                                borrow.getStart_time(),
//                                borrow.getEnd_time(),
//                                borrow.getOk()==1?"已归还√":"未归还×"
//                        ));
//        }
//        return listTwo;
//    }


}
